package cn.fuxi2022.accounts.activity.controller;


import cn.fuxi2022.accounts.activity.service.GroupActivityService;
import cn.fuxi2022.core.exception.SmartGroupException;
import cn.fuxi2022.model.empty.accounts.GroupActivity;
import cn.fuxi2022.model.resp.PageUtils;
import cn.fuxi2022.model.resp.R;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * <p>
 * 社团活动表 前端控制器
 * </p>
 *
 * @author Fuxi
 * @since 2022-10-19 08:42:14
 */
@RestController
@RequestMapping("admin/activity")
public class GroupActivityController {
    @Autowired
    private GroupActivityService groupActivityService;


    /**
     * 列表
     */
    @PostMapping("/list")
    public R list(@RequestBody Map<String, Object> params) {
        PageUtils page = groupActivityService.queryPage(params);

        return R.ok().data(page);
    }

    /**
     * 信息
     */
    @GetMapping("/info/{id}")
    public R info(@PathVariable("id") String id) {
        GroupActivity groupActivity = groupActivityService.getById(id);

        return R.ok().data("groupActivity", groupActivity);
    }

    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody @Validated(GroupActivity.Save.class) GroupActivity groupActivity) {
        checkActivity();
        // 将活动设置为未开始
        groupActivity.setStatus(0);
        groupActivityService.save(groupActivity);
        return R.ok("保存活动成功");
    }

    public void checkActivity() {
        // 开始活动时，判断当前是否有仍然在进行中的活动
        LambdaQueryWrapper<GroupActivity> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(GroupActivity::getStatus, 1);
        long count = groupActivityService.count(wrapper);
        if (count > 0) {
            throw new SmartGroupException("当前有活动进行中，结束活动后，才能再次开始活动");
        }
    }

    /**
     * 修改
     */
    @PutMapping("/update")
    public R update(@RequestBody @Validated(GroupActivity.Update.class) GroupActivity groupActivity) {
        groupActivityService.updateById(groupActivity);
        return R.ok("修改活动成功");
    }



    @PostMapping("/start/{id}")
    public R startActivity(@PathVariable String id, @RequestBody Map map) {
        // 开始活动时，判断当前是否有仍然在进行中的活动
        checkActivity();

        // 判断结束时间是否合法
        if (ObjectUtils.isEmpty(map.get("endTime"))) {
            return R.error("结束时间必须指定");
        }

        groupActivityService.startActivity(id, (String) map.get("endTime"));

        return R.ok("开始活动成功");
    }

    @PostMapping("/stop/{id}")
    public R stopActivity(@PathVariable String id) {

        // 手动结束活动
        groupActivityService.stopActivity(id);

        return R.ok("结束活动成功");
    }
}
